package com.zhentao.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zhentao.dto.ProductDto;
import com.zhentao.pojo.Product;
import com.zhentao.pojo.ProductImage;
import com.zhentao.pojo.CategoryLevel2;
import com.zhentao.service.CategoryLevel2Service;
import com.zhentao.service.ProductImageService;
import com.zhentao.service.ProductService;
import com.zhentao.vo.Result;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.Collections;

@RestController
@RequestMapping("/product")
public class ProductController {
// 商品管理功能设计说明

    // 添加商品：
    //   - 商品名称
    //   - 商品封面
    //   - 商品所属分类
    //   - 商品规格（SKU）
    //   - 商品进货价格
    //   - 商品价格
    //   - 商品参数
    //   - 商品详情图片
    //   - 操作：保存、取消、移除

    // 商品列表功能：
    //   - 搜索：支持根据商品ID或关键词搜索
    //   - 列表项展示字段：
    //       - 商品ID
    //       - 商品名称
    //       - 商品封面
    //       - 商品所属分类
    //       - 操作：添加并编辑、编辑、移除

    // 商品详情页面：
    //   - 商品名称
    //   - 商品封面
    //   - 商品轮播图
    //   - 商品所属分类
    //   - 商品参数
    //   - 商品详情图片
    //   - 商品SKU信息：
    //       - 商品规格
    //       - 商品进货价格
    //       - 商品价格
    //   - 操作：保存、取消、移除
    @Autowired
    private ProductService productService;
    @Autowired
    private CategoryLevel2Service categoryLevel2Service;
    @Autowired
    private ProductImageService productImageService;

    // 删除商品（逻辑删除）
//    @CrossOrigin
    @RequestMapping("/delete")
    public Result delete(@RequestParam("productId") Long productId) {
        Product product = new Product();
        product.setProductId(productId);
        product.setStatus(0);
        product.setIsDeleted(1);
        boolean b = productService.updateById(product);
        return b ? Result.success() : Result.fail("删除失败");
    }

    // 更改商品上下架状态
//    @CrossOrigin
    @RequestMapping("/changeStatus")
    public Result changeStatus(@RequestParam("productId") Long productId,@RequestParam("status") Integer status) {
        Product product = new Product();
        product.setProductId(productId);
        product.setStatus(status);
        boolean b = productService.updateById(product);
        return b ? Result.success() : Result.fail("更新失败");
    }

//    @CrossOrigin
    @RequestMapping("/detail")
    public Page<ProductDto> detail(String name, Integer status, Integer pageNum, Integer pageSize) {
        // 设置默认分页参数
        if (pageNum == null || pageNum <= 0) {
            pageNum = 1;
        }
        if (pageSize == null || pageSize <= 0) {
            pageSize = 10;
        }
        
        Page<Product> page = new Page<>(pageNum, pageSize);
        QueryWrapper<Product> queryWrapper = getProductQueryWrapper(name, status);

        Page<Product> product = productService.page(page, queryWrapper);

        // 构建返回的DTO分页对象
        Page<ProductDto> productDtoPage = new Page<>(pageNum, pageSize);
        productDtoPage.setTotal(product.getTotal());
        productDtoPage.setSize(product.getSize());
        productDtoPage.setCurrent(product.getCurrent());
        productDtoPage.setPages(product.getPages());

        // 创建新的可变列表来存储结果
        List<ProductDto> productDtoList = new ArrayList<>();
        List<Product> records = product.getRecords();
        
        if (records.isEmpty()) {
            productDtoPage.setRecords(productDtoList);
            return productDtoPage;
        }

        // 批量获取分类信息 - 避免N+1查询问题
        List<Long> level2Ids = records.stream()
                .map(Product::getLevel2Id)
                .filter(id -> id != null)
                .distinct()
                .collect(Collectors.toList());
        
        Map<Long, String> categoryMap = Collections.emptyMap();
        if (!level2Ids.isEmpty()) {
            try {
                categoryMap = categoryLevel2Service.listByIds(level2Ids).stream()
                        .collect(Collectors.toMap(
                                CategoryLevel2::getLevel2Id,
                                CategoryLevel2::getName,
                                (existing, replacement) -> existing
                        ));
            } catch (Exception e) {
                // 分类查询失败时使用空Map，后续会使用默认值
                categoryMap = Collections.emptyMap();
            }
        }

        // 批量获取商品图片 - 避免N+1查询问题
        List<Long> productIds = records.stream()
                .map(Product::getProductId)
                .collect(Collectors.toList());
        
        Map<Long, String> imageMap = Collections.emptyMap();
        try {
            List<ProductImage> productImages = productImageService.list(
                    new QueryWrapper<ProductImage>()
                            .in("product_id", productIds)
                            .eq("type", 0)
                            .eq("sort_order", 1)
            );
            imageMap = productImages.stream()
                    .collect(Collectors.toMap(
                            ProductImage::getProductId,
                            ProductImage::getImageUrl,
                            (existing, replacement) -> existing
                    ));
        } catch (Exception e) {
            // 图片查询失败时使用空Map，后续会使用默认值
            imageMap = Collections.emptyMap();
        }

        // 构建DTO列表
        final Map<Long, String> finalCategoryMap = categoryMap;
        final Map<Long, String> finalImageMap = imageMap;
        
        for (Product record : records) {
            // 获取分类名称
            String levelName = finalCategoryMap.getOrDefault(record.getLevel2Id(), "未分类");
            
            // 获取商品图片
            String imageUrl = finalImageMap.getOrDefault(record.getProductId(), "/images/default-product.gif");
            
            ProductDto productDto = getProductDto(record, levelName, imageUrl);
            productDtoList.add(productDto);
        }

        // 设置records列表
        productDtoPage.setRecords(productDtoList);

        return productDtoPage;
    }

    @NotNull
    private static QueryWrapper<Product> getProductQueryWrapper(String name, Integer status) {
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();

        // 按名称模糊查询
        if (name != null && !name.trim().isEmpty()) {
            queryWrapper.like("name", name);
        }

        // 按状态查询
        if (status != null && status >= 0 && status <= 2) {
            if (status == 2) {
                // 库存预警：库存小于10的商品
                queryWrapper.lt("stock", 10);
            } else {
                // 0-已下架，1-在售
                queryWrapper.eq("status", status);
            }
        }

        queryWrapper.eq("is_deleted", 0);
        // 按创建时间倒序排列
        queryWrapper.orderByDesc("create_time");
        return queryWrapper;
    }

    @NotNull
    private static ProductDto getProductDto(Product record, String levelName, String imageUrl) {
        ProductDto productDto = new ProductDto();
        productDto.setProductId(record.getProductId());
        productDto.setName(record.getName());
        productDto.setLevelName(levelName);
        productDto.setPic(imageUrl);
        productDto.setPrice(record.getPrice() != null ? record.getPrice().doubleValue() : null);
        productDto.setOriginalPrice(record.getOriginalPrice() != null ? record.getOriginalPrice().doubleValue() : null);
        productDto.setStock(record.getStock());
        productDto.setSalesCount(record.getSalesCount());
        productDto.setStatus(record.getStatus());
        return productDto;
    }
}
